﻿Public Class CLabelCheckState3 : Inherits CStateBase

    ''' <summary>
    ''' 実行可能かを判断する
    ''' </summary>
    ''' <param name="task"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overrides Function IsEnter(ByVal task As CTaskBase) As Boolean
        Debug.WriteLine("CLabelCheckState.IsEnter")
        If CCommon.isInStr(task.ActionCd, "LABEL", "CHNG") Then
            Return True
        Else
            Return False
        End If
    End Function

    ''' <summary>
    ''' 実行メソッド
    ''' </summary>
    ''' <param name="task"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overrides Function DoExecute(ByVal task As CTaskBase) As CStateBase
        Dim nextState As CStateBase = Nothing
        Dim pdaTask As CPDATask3 = DirectCast(task, CPDATask3)
        Dim webMng As CWebManager = CWebManager.GetInstance
        Dim AppManager As CApplicationManager = CApplicationManager.GetInstance
        Dim checkLblData As CCheck = CCheck.GetIns

        'データベース接続
        Dim StateDao As CMasterDAO = New CMasterDAO
        Dim app As CApplication = CApplication.GetInstance()
        Dim sql As CSQLite = app.MasterDB()
        Dim trx As CTransaction = sql.GetTransaction

        If task.ProcessText = "" Then
            '取消モード
            '初期モードはラベル事の取消。
            If CCommon.FlagManage("MSG") Then
                CCommon.FlagManage("MSG", False)
            Else
                pdaTask.WindowManager.SetMessage(CConst.CNS_MSG_044, CConst.COLOR_BLACK, CConst.COLOR_GREEN)
                'If CCommon.FlagManage("ORDER_CANCEL_MODE") Then
                '    pdaTask.WindowManager.SetMessage(CConst.CNS_MSG_048, CConst.COLOR_BLACK, CConst.COLOR_GREEN)
                'Else
                '    pdaTask.WindowManager.SetMessage(CConst.CNS_MSG_049, CConst.COLOR_BLACK, CConst.COLOR_GREEN)
                'End If
            End If
            '待つ状態
            task.ProcessText = task.ReadTextWait(-1)
        End If

        '終了コード読むとき
        If task.ProcessText.StartsWith(CConst.CNS_END_LABEL) Then
            pdaTask.WindowManager.SetMessage(CConst.CNS_MSG_023, CConst.COLOR_BLACK, CConst.COLOR_GREEN)
            Debug.WriteLine("終了コード読みました。")
            'CPersonal.shpOrderDataSend(pdaTask)
            pdaTask.WindowManager.BaseRelease()
            pdaTask.WindowManager.CloseWindow()
        End If

        Select Case task.ProcessText

            Case CConst.CNS_SEND
                '途中送信送るとき
                CPersonal.ErrorWindow3(pdaTask, EnumWindowMode.ALERT_MODE, _
                          Color.Black, CConst.EnumSound.ALERT_BUZZ, CConst.CNS_MSG_062, Color.White)
                task.ActionCd = "LABEL"
                task.ProcessText = ""
                nextState = GetNextState(task)
                Return nextState

            Case CConst.CANCEL_OK
                '途中送信送るとき
                CPersonal.ErrorWindow3(pdaTask, EnumWindowMode.ALERT_MODE, _
                          Color.Black, CConst.EnumSound.ALERT_BUZZ, CConst.CNS_MSG_064, Color.White)
                task.ActionCd = "LABEL"
                task.ProcessText = ""
                nextState = GetNextState(task)
                Return nextState

            Case CConst.CNS_SCREEN
                '途中送信送るとき
                CPersonal.ErrorWindow3(pdaTask, EnumWindowMode.ALERT_MODE, _
                          Color.Black, CConst.EnumSound.ALERT_BUZZ, CConst.CNS_MSG_063, Color.White)
                task.ActionCd = "LABEL"
                task.ProcessText = ""
                nextState = GetNextState(task)
                Return nextState

                '確定ボタン押したらサーバーに情報を送る
                'サーバーとの通信する
            Case CConst.CNS_ENTER_OS
                'バーコードを読んだかどうか
                If pdaTask.WindowManager.GetCancelDataCount > 0 Then

                    'ユニークコードがあるかどうか
                    Dim retSetCdLst As ArrayList = StateDao.GetOrderCdInfo(trx, pdaTask.CancelLabelList)
                    'Pdaのデータにはないのでサーバーと接続して見る
                    If retSetCdLst Is Nothing Then

                        '画面でデータがないです。と画面表示
                        'MessageBox.Show("データがないです。 サーバーとの接続")
                        Debug.WriteLine("一致するデータがないです。")

                        CPersonal.ErrorWindow3(pdaTask, EnumWindowMode.ALERT_MODE, _
                                       Color.Black, CConst.EnumSound.ALERT_BUZZ, CConst.CNS_MSG_052, Color.White)
                        task.ActionCd = "LABEL"
                        pdaTask.CancelLabelList.Clear()
                        pdaTask.Count = 0
                        pdaTask.WindowManager.ReleaseLabelCanceList()
                        CCommon.FlagManage("CANCEL", False)
                    Else

                        If retSetCdLst.Count = 0 Then
                            '画面でデータがないです。と画面表示
                            'MessageBox.Show("データは有り->Matchが出来ません。")
                            Debug.WriteLine("取り消しするデータを読んでないです。")
                            CPersonal.ErrorWindow3(pdaTask, EnumWindowMode.ALERT_MODE, _
                                    Color.Black, CConst.EnumSound.ALERT_BUZZ, CConst.CNS_MSG_052, Color.White)
                            task.ActionCd = "LABEL"

                            pdaTask.CancelLabelList.Clear()
                            pdaTask.Count = 0
                            pdaTask.WindowManager.ReleaseLabelCanceList()
                            'pdaTask.WindowManager.GetCurrentLabelCheckRecord()
                            CCommon.FlagManage("CANCEL", False)

                        Else
                            CCommon.FlagManage("CANCEL", True)

                            '画面に表示
                            For i As Integer = 0 To retSetCdLst.Count - 1
                                Dim record As COrderRecord = pdaTask.WindowManager.CreateReportRecord
                                '注文コードで検索して見
                                If Not "" = retSetCdLst(i) Then
                                    Dim retList As CResultSet = StateDao.GetSetCdOrderInfo(trx, retSetCdLst(i))

                                    'MessageBox.Show("setCd-" & i & ":" & retSetCdLst(i))
                                    record.RowNum = retList.GetString("row_num")
                                    record.ShiporderCd = retList.GetString("shiporder_cd")
                                    record.InvoiceCd = retList.GetString("invoice_cd")
                                    record.OrderCd = retList.GetString("order_cd")      '-->システムの注文番号

                                    record.ItemCd = retList.GetString("item_cd")
                                    record.ItemName = retList.GetString("item_name")
                                    record.SysItemCd = retList.GetString("sysitem_cd")
                                    record.OrderQty = retList.GetInt("order_qty")
                                    'CFileLog.WriteLog("エラー落ちるかもー１２")
                                    'record.ActionQty = StateDao.GetOrderData(trx, record.OrderCd)   'データベースで探す
                                    record.ActionQty = StateDao.GetOrderData2(trx, retList.GetString("set_cd"))   'データベースで探す
                                    record.ShiporderQty = retList.GetInt("order_qty")


                                    record.BoxQty = retList.GetInt("inBox_qty")
                                    record.ReserveCd = retList.GetString("reserve_cd")   '-->内示品番
                                    'record.SetCd = retList.GetString("set_cd")
                                    record.SetCd = StateDao.GetLinkKey(trx, retList.GetString("set_cd"))

                                    '条件で合うものだけリスト状に表示させる
                                    'MessageBox.Show("ADD")
                                    pdaTask.WindowManager.AddRecord(record)
                                    retList.Close()
                                End If
                            Next
                            If retSetCdLst.Count > 0 Then
                                'MessageBox.Show("REPORT_LIST前")
                                pdaTask.WindowManager.ChangeWindowMode(EnumWindowMode.REPORTLIST_MODE)
                                '選択情報の初期化
                                'MessageBox.Show("REPORT_LIST後")
                                pdaTask.WindowManager.Set_m_IndexInit()
                                '選択してください。
                                'MessageBox.Show("メッセージ前")
                                pdaTask.WindowManager.SetMessage(CConst.CNS_MSG_045, CConst.COLOR_BLACK, CConst.COLOR_GREEN)
                                CCommon.FlagManage("MSG", True)
                                'MessageBox.Show("メッセージ後")
                                'task.ActionCd = "CANCEL"
                            End If
                        End If

                    End If

                Else

                    CPersonal.ErrorWindow3(pdaTask, EnumWindowMode.ALERT_MODE, _
                               Color.Black, CConst.EnumSound.ALERT_BUZZ, CConst.CNS_MSG_051, Color.White)

                    task.ActionCd = "LABEL"
                    task.ProcessText = ""
                    nextState = GetNextState(task)

                    Return nextState
                End If

            Case CConst.CNS_ORDER_CLR
                '取消変換
                '注文取消モード
                CCommon.FlagManage("ORDER_CANCEL_MODE", True)

            Case CConst.CNS_LABEL_CLR
                '取消変換
                'ラベル取消モード
                CCommon.FlagManage("ORDER_CANCEL_MODE", False)

            Case CConst.CNS_CLR
                '取消の取消したい場合-->メニュー画面に行く
                If CPersonal.ConfirmWindow3(pdaTask, EnumWindowMode.YESNO_MODE, Color.Black, _
                                        CConst.EnumSound.YESNO_BUZZ, CConst.CNS_MSG_054, Color.White) Then

                    pdaTask.CancelLabelList.Clear()

                    '絞るリストを取り消し
                    Dim delRecord As ArrayList = New ArrayList()
                    For i As Integer = 0 To pdaTask.WindowManager.GetCancelDataCount - 1
                        Dim shpOrderData As COrderRecord = pdaTask.WindowManager.GetCancelRecord(i)
                        delRecord.Add(shpOrderData)
                    Next
                    For j As Integer = 0 To delRecord.Count - 1
                        pdaTask.WindowManager.DelRecord(delRecord(j), True)
                    Next

                    '絞ったリストは削除---------------------->>START
                    delRecord = New ArrayList()
                    For i As Integer = 0 To pdaTask.WindowManager.GetLabelCancelCount - 1
                        Dim shpOrderData As COrderRecord = pdaTask.WindowManager.GetRecord(i, CBaseRecord.EnumRecordType.LabelCancel)
                        delRecord.Add(shpOrderData)
                    Next
                    For j As Integer = 0 To delRecord.Count - 1
                        pdaTask.WindowManager.DelRecord(delRecord(j), True)
                    Next
                    '絞ったリストは削除---------------------->>END

                    '画面はリスト画面に戻る
                    pdaTask.WindowManager.ChangeWindowMode(EnumWindowMode.LIST_MODE)

                End If


            Case CConst.CNS_CANCEL_END
                '取消の取消したい場合-->メニュー画面に行く
                If CPersonal.ConfirmWindow3(pdaTask, EnumWindowMode.YESNO_MODE, Color.Black, _
                                                       CConst.EnumSound.YESNO_BUZZ, CConst.CNS_MSG_050, Color.White) Then
                    pdaTask.WindowManager.BaseRelease()
                    pdaTask.WindowManager.CloseWindow()
                End If

            Case CConst.CNS_ENTER_OK
                '絞ったリストから選択する
                'MessageBox.Show("選択")
                If AppManager.m_AppSetting.SrvRecv Then
                    '結果待つ---->>START

                    '結果待つ---->>END
                Else
                    '結果を待たない---->>START

                    '結果を待たない---->>END
                End If

            Case Else
                If task.ProcessText.StartsWith(CConst.CANCEL_DEL) Then

                    '取り消すものを選択
                    Dim linkKeyCd As String = task.ProcessText.Replace(CConst.CANCEL_DEL, "")
                    'MessageBox.Show("選択されたSETCD:" & linkKeyCd)
                    Debug.WriteLine("選択されたSETCD:" & linkKeyCd)

                    '1番 '選択されたデータの送信フラグを見て、送信済のものがあれがサーバーに
                    '取り消すSET_CDを送ってサーバーにあるものも取り消す
                    '2番 選択されてるSET_CDを実績テーブルで削除し
                    '3番 ページを探して表示する

                    '1番
                    Dim sendFlg As Boolean = StateDao.GetSetCdSendFlg(trx, linkKeyCd)
                    Dim setCd As String = StateDao.GetSetCd(trx, linkKeyCd)
                    'MessageBox.Show("選択されたSETCD:" & setCd)
                    If sendFlg Then
                        '実績データを送信済み
                        Dim cancelSet As ArrayList = New ArrayList
                        cancelSet.Add(linkKeyCd & vbTab & Now)

                        '設定ファイルで結果待ち、結果待ちしないか
                        If AppManager.m_AppSetting.SrvRecv Then
                            pdaTask.WindowManager.SetMessage(CConst.CNS_MSG_008, CConst.COLOR_BLACK, CConst.COLOR_GREEN)
                            'MessageBox.Show("11")
                            '結果を待つ
                            Dim filePath As String = CApplicationManager.GetRealPath(CApplicationManager.SETTING_ACT_PATH, CApplicationManager.EnumSpecialFolder.PATH_MYDOCUMENT)
                            'ファイル作成
                            Dim ret As String = CFiles.FileOutput2("SHP_CANCEL-" & System.Environment.TickCount.ToString(), filePath, cancelSet)
                            If webMng.CacelUploadResult(ret, CConst.CANCEL_UPLOAD) Then

                            Else
                                '警告やエラーメッセージを出す--------->>START
                                CPersonal.ErrorWindow3(pdaTask, EnumWindowMode.ALERT_MODE, Color.Black, CConst.EnumSound.ALERT_BUZZ, CConst.CNS_MSG_052, Color.White)
                                task.ActionCd = "LABEL"
                                CCommon.FlagManage("CANCEL", False)

                                'actionボタンも消す
                                pdaTask.WindowManager.ClearActionLabel()
                                pdaTask.WindowManager.ChangeWindowMode(EnumWindowMode.LIST_MODE)

                                task.ProcessText = ""
                                nextState = GetNextState(task)
                                Return nextState
                                '警告やエラーメッセージを出す--------->>END
                            End If
                        Else
                            '結果を待たさない
                            Dim filePath As String = CApplicationManager.GetRealPath(CApplicationManager.SETTING_ACT_PATH, CApplicationManager.EnumSpecialFolder.PATH_MYDOCUMENT)
                            CBgControl.BgThread("SHP_CANCEL-" & System.Environment.TickCount.ToString(), "csv", filePath, cancelSet, CConst.CANCEL_UPLOAD)
                            CFileLog.WriteLog("照合中の取り消し", "1", CFileLog.EnumLogType.UPLOAD)

                        End If
                    Else
                        '実績データを未送信
                    End If

                    '2番
                    Dim strSetDao As CResultSet = StateDao.GetSetCdOrderInfo(trx, setCd)
                    Dim setOrderCd As String = strSetDao.GetString("order_cd")
                    Dim actQty As Integer = StateDao.GetActionQty(trx, setOrderCd)

                    If Not strSetDao Is Nothing Then
                        'For i As Integer = 0 To strSetDao.FieldCount - 1
                        While strSetDao.Read()
                            If strSetDao.GetString("unique_cd") <> "" Then
                                trx.UpdateSQL("delete from unique_lblData where unique_cd='" & strSetDao.GetString("unique_cd") & "'")
                                trx.UpdateSQL("delete from unique_shData where unique_cd='" & strSetDao.GetString("unique_cd") & "'")
                            End If
                        End While

                        'Next
                        strSetDao.Close()
                    End If
                    trx.UpdateSQL("delete from orderdata_tbl where set_cd='" & setCd & "'")
                    trx.UpdateSQL("delete from orderdata_detail where set_cd='" & setCd & "'")

                    trx.UpdateSQL("delete from lblData_tbl where set_cd='" & setCd & "'")
                    trx.UpdateSQL("delete from lblData_detail where set_cd='" & setCd & "'")

                    '完全に照合成功
                    pdaTask.Hardware.nextC()

                    pdaTask.CancelLabelList.Clear()
                    pdaTask.Count = 0
                    pdaTask.WindowManager.ReleaseLabelCanceList()
                    pdaTask.WindowManager.ReleaseReport()

                    'pdaTask.WindowManager.GetCurrentLabelCheckRecord()
                    CCommon.FlagManage("CANCEL", False)
                    'actionボタンも消す
                    pdaTask.WindowManager.ClearActionLabel()
                    '画面はリスト画面に戻る
                    pdaTask.WindowManager.ChangeWindowMode(EnumWindowMode.LIST_MODE)
                    'pdaTask.WindowManager.ChangeWindowMode(EnumWindowMode.LIST_MODE)

                Else
                    '読んだバーコード種類
                    Dim barCdType As String = StateDao.CheckBarCdType(trx, task.ProcessText)
                    'タイプがないとエラー
                    If barCdType = "" Then
                        'ただの警告
                        CPersonal.ErrorWindow3(pdaTask, EnumWindowMode.ALERT_MODE, _
                                     Color.Black, CConst.EnumSound.ALERT_BUZZ, CConst.CNS_MSG_007, Color.White)

                        '画面はリスト画面に戻る
                        pdaTask.WindowManager.ChangeWindowMode(EnumWindowMode.LIST_MODE)

                        task.ActionCd = "LABEL"
                        task.ProcessText = ""
                        nextState = GetNextState(task)

                        Return nextState
                    Else
                        'リストにADDする
                        Dim recordList As COrderRecord = pdaTask.WindowManager.CreateCancelActionList
                        Dim barNm As String = StateDao.GetBarcdName(trx, barCdType)

                        pdaTask.CancelLabelList.Add(task.ProcessText)
                        pdaTask.Count += 1
                        With recordList
                            .RowNo = pdaTask.Count
                            .ReadText = task.ProcessText '--->バーコードの値
                            .OrderType = ""   '--->バーコード種類
                        End With

                        pdaTask.WindowManager.AddRecord(recordList)

                    End If
                End If

        End Select

        task.ProcessText = ""
        task.ActionCd = "LABEL"
        nextState = GetNextState(task)
        Return nextState
    End Function

    ''' <summary>
    ''' 終了メソッド(未使用)
    ''' </summary>
    ''' <param name="task"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Overrides Function DoExit(ByVal task As CTaskBase) As Boolean
        Debug.WriteLine("CLabelCheckState.DoExit")
        Return True
    End Function


End Class
